package com.ddpt.platform.common.util;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.ddpt.platform.common.base.BizEntity;
import com.ddpt.platform.common.base.BizService;
import com.ddpt.platform.common.base.BizServiceImpl;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * 使用方法：在permission项目中调用生成方法(若在其他项目中调用，则需引入velocity依赖)，成功后需修改对应的entity，去除泛型及
 * pkVal()方法(此报错行为暂无解决方案)，然后将service包下的entity实体类和service接口转移到项目对应的api项目中
 */
public class MybatisPlusGenerator {
    /**
     * 根据数据库表生成对应的实体类等信息, 覆盖原来的
     * @param author
     * @param tables 要生成的表
     * @param artifactId 项目名，目前仅支持不带api的项目
     */
    public static void generator(String author, String[] tables, String artifactId) {
        String projectRootDic = System.getProperty("user.dir") + File.separator + artifactId;

        // 1. 全局配置
        GlobalConfig config = new GlobalConfig();
        config.setActiveRecord(true) // 是否支持AR模式
                .setAuthor(author) // 作者
                .setOutputDir(projectRootDic + "/src/main/java") // for mac
                .setFileOverride(true) // 文件覆盖
                .setIdType(IdType.AUTO) // 主键策略
                .setEnableCache(false)
                .setServiceName("%sService") // 设置生成的service接口的名字的首字母是否为I
                .setEntityName("%sEntity")
                .setBaseResultMap(true);// 生成基本的resultMap
//                .setBaseColumnList(true);// 生成基本的SQL片段

        // 2. 数据源配置
        String dbName = "marketing-" + artifactId;
        DataSourceConfig dsConfig = new DataSourceConfig();
        dsConfig.setDbType(DbType.MYSQL) // 设置数据库类型
                .setDriverName("com.mysql.cj.jdbc.Driver")
                .setUrl("jdbc:mysql://47.97.168.156:3306/" + dbName + "?useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai")
                .setUsername("root").setPassword("wtfrds123!");

        // 3. 策略配置globalConfiguration中
        StrategyConfig stConfig = new StrategyConfig();
        stConfig.setCapitalMode(true) // 全局大写命名
                .setColumnNaming(NamingStrategy.underline_to_camel) // 指定表名 字段名是否使用下划线
                .setNaming(NamingStrategy.underline_to_camel)// 数据库表映射到实体的命名策略
                .setRestControllerStyle(true)
                .setEntityLombokModel(true)
                .setEntityTableFieldAnnotationEnable(true)
                .setSuperEntityClass(BizEntity.class)
                .setSuperEntityColumns("id","merchant_id","create_time","update_time","deleted")
                .setSkipView(true)
                .setSuperMapperClass("com.ddpt.platform.common.base.BizMapper")
                .setSuperServiceClass(BizService.class)
                .setSuperServiceImplClass(BizServiceImpl.class)
                .setInclude(tables); // 指定扫描的表的名称,多张表之间以英文逗号分隔
        // .setTablePrefix("hyb_"); //指定扫描表的前缀

        // 4. 包名策略配置
        PackageConfig pkConfig = new PackageConfig();
        pkConfig.setParent("com.ddpt.platform." + artifactId);
//                .setMapper("mapper")// dao
//                .setService("dubbo")// servcie
//                .setServiceImpl("dubbo.impl")
//                .setController("controller")// controller
//                .setEntity("dubbo");
        // .setXml("mapper");//mapper.xml
        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 如果模板引擎是 freemarker
        // String templatePath = "/templates/mapper.xml.ftl";
        // 如果模板引擎是 velocity
        String templatePath = "/templates/mapper.xml.vm";
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                return projectRootDic + "/src/main/resources/mapper/" + tableInfo.getMapperName() + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();
//        templateConfig.disable(TemplateType.CONTROLLER);
        templateConfig.disable(TemplateType.XML);

        // 5. 整合配置
        AutoGenerator ag = new AutoGenerator();
        ag.setGlobalConfig(config).setDataSource(dsConfig).setStrategy(stConfig).setPackageInfo(pkConfig).setCfg(cfg)
                .setTemplate(templateConfig);

        // 6. 执行
        ag.execute();
    }
}
